const express = require('express')
const res = require('express/lib/response')
const fs = require('fs')
const { getDb, saveDb } = require('./util/db')

const app = express()
// 配置解析表单请求体：application/json
app.use(express.json())
// 配置表单请求体： application/x-www-form-urlencoded
app.use(express.urlencoded())

app.get('/', (req, res) => {
  res
    .cookie('foo', 'bar')
    .cookie('age', 30)
    .status(201)
    .send({
      name: '张三'
    })
})

/**
 * 查询数据列表
 */
app.get('/todos', async (req, res) => {
  try {
    const db = await getDb() // Promise
    res.status(200).json(db.todos)
  } catch (err) {
    res.status(500).json({
      error: err.message
    })
  }
  // fs.readFile('./db.json', 'utf-8', (err, data) => {
  //   if (err) {
  //     return res.status(500).json({
  //       error: err.message
  //     })
  //   }
  //   const db = JSON.parse(data)
  //   res.status(200).json(db.todos)
  // })
})

/**
 * 查询某一项数据
 */
app.get('/todos/:id', async (req, res) => {
  try {
    const db = await getDb()
    const todo = db.todos.find(todo => todo.id === Number.parseInt(req.params.id))
    if (!todo) {
      return res.status(404).end('未找到资源')
    }
    res.status(200).json(todo)
  } catch (err) {
    res.status(500).json({
      error: err.message
    })
  }
  // fs.readFile('./db.json', 'utf-8', (err, data) => {
  //   if (err) {
  //     return res.status(500).json({
  //       error: err.message
  //     })
  //   }
  //   const db = JSON.parse(data)
  //   const todo = db.todos.find(todo => todo.id == req.params.id)
  //   if (!todo) {
  //     return res.status(404).end()
  //   }
  //   res.status(200).json(todo)
  // })
})

/**
 * 添加数据
 */
app.post('/todos', async (req, res) => {
  try {
    // 获取客户端参数
    const todo = req.body
    // 数据校验
    if (!todo.title) {
      return res.status(422).json({
        error: 'The field title is required.'
      })
    }
    // 保存数据
    const db = await getDb()
    const lastTodo = db.todos[db.todos.length - 1]
    todo.id = lastTodo ? lastTodo.id + 1 : 1
    db.todos.push(todo)
    saveDb(db)
    res.status(200).json(todo)
  } catch (err) {
    res.status(500).json({
      error: err.message
    })
  }
})

/**
 * 修改数据
 */
app.patch('/todos/:id', async (req, res) => {
  try {
    // 获取表单数据
    const todo = req.body
    const db = await getDb()
    // 查找要修改的项
    const ret = db.todos.find(todo => todo.id === Number.parseInt(req.params.id))
    if (!ret) {
      return res.status(404).end('not found')
    }
    // 修改数据
    console.log(ret, todo)
    Object.assign(ret, todo)
    await saveDb(db)
    res.status(200).json(ret)

  } catch (err) {
    res.status(500).json({
      error: err.message
    })
  }
})

/**
 * 删除数据
 * */
app.delete('/todos/:id', async (req, res) => {
  try {
    const todoId = Number.parseInt(req.params.id)
    if (!todoId) {
      return res.status(501).json({
        error: '参数未传递'
      })
    }
    const db = await getDb()
    const index = db.todos.findIndex(todo => todo.id === todoId)
    // 查找被删除的项是否存在
    if (index === -1) {
      return res.status(404).end('not Found')
    }
    db.todos.splice(index, 1)
    await saveDb(db)
    res.status(200).json({
      msg: 'success'
    })
  } catch (err) {
    res.status(500).json({
      error: err.message
    })
  }
})

app.listen(3000, () => {
  console.log(`Server is running http://localhost:3000/`)
})